home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Mac Game Programming Gurus / TricksOfTheMacGameProgrammingGurus.iso / More Source / C⁄C++ / AIFF DSP v22 / plugin_src / zerocross.c < prev   
Text File  |  1995-01-30  |  2KB  |  80 lines

  1. /* collects data on the length between zero-crossings. */
  2.  
  3. #include <stdio.h>
  4. #include <assert.h>
  5. #include <string.h>
  6.  
  7. #include "plugin_specific.h"
  8. #include "aiff.h"
  9.  
  10. #define BINS    40
  11. #define BINSIZE 5
  12.  
  13. static long histogram[BINS+1] = {0};
  14.  
  15. void init_process_zerocross( void )
  16. {
  17.    if ( nh.wdsi != 8 ) err( "Cannot process a file with this word size" );
  18.    if ( nh.chan != 1 ) err( "Cannot process a multichannel file" );
  19. }
  20.  
  21. void term_process_zerocross ( void )
  22. {
  23. #define BARMAX 60
  24.    int i, barlen;
  25.    long histmax = 0;
  26.    char bar[80];
  27.  
  28.    memset( bar, '*', BARMAX );
  29.    
  30.    for (i=0; i<BINS; i++)
  31.       if (histogram[i] > histmax) histmax = histogram[i];
  32.  
  33.    printf( "out of range: %ld\n", histogram[BINS] );
  34.    for (i=0; i<BINS; i++)
  35.    {
  36.       barlen = (float) BARMAX * histogram[i]/histmax;
  37.       printf( "[%.3d...%.3d): %.4ld %.*s\n",
  38.                i*BINSIZE, (i+1)*BINSIZE, histogram[i], barlen, bar );
  39.    }
  40. }
  41.  
  42. void bin ( long len )
  43. {
  44.    assert( len > 0 );
  45.    if ( len < BINS*BINSIZE ) histogram[len/BINSIZE]++;
  46.    else histogram[BINS]++;
  47. }
  48.  
  49. void process_samdat_zerocross ( long buflen )
  50. {
  51.    register char *td, *endd;
  52.    static char last = 0;
  53.    static long abs_pos = 0, last_zero = 0;
  54.    
  55.    td   = d;
  56.    endd = &td[buflen];
  57.    
  58.    do
  59.    {
  60.       if ( (*td > 0) != (last > 0) )
  61.       {
  62.          bin( abs_pos - last_zero );
  63.          last_zero = abs_pos;
  64.       }
  65.       last = *td;
  66.       abs_pos++;
  67.       td++;
  68.    }
  69.    while ( td < endd );
  70. }
  71.  
  72. plugin_info plugin_zerocross =
  73. {
  74.    init_process_zerocross,
  75.    term_process_zerocross,
  76.    process_samdat_zerocross,
  77.    1, /* take_input */
  78.    0  /* make_output */
  79. };
  80.